package com.coderman.infosys.auth.domain.repository;

import com.coderman.infosys.auth.domain.bo.role.RoleBO;
import com.coderman.infosys.auth.domain.bo.user.UserGroupBO;
import com.coderman.infosys.auth.domain.bo.role.RoleGroupBO;
import com.coderman.infosys.plat.auth.common.dto.ResultDataDto;

import java.util.List;


/**
 * @Description:用户和角色管理仓库接口
 * @Author:shenshuai
 * @CreateTime:2022-01-02 15:27:38
 * @version v1.0
 * 对于用户和角色来说可能并太合适作为一个聚合根
 * 所以这个UserRoleRepository的定位可能不太合适，
 * 对于用户已经在另外一个领域服务的情况，这里
 * 可能更好的方式就是UserRoleGroupRepository进行命名，
 * 或者我们应该识别出一个组的概念让组作为一个聚合根
 * 那么这种方式可能更好。
 * 所以对于部门这种的划分在组的概念中会更有趣
 */
public interface UserRoleRepository{

	/**
	 *
	 * @Description 保存用户组
	 * @param userGroupBO
	 * @return Long
	 */
     Long registUserGroup(UserGroupBO userGroupBO);

	/**
	 *
	 * @Description 更新用户组
	 * @param userGroupBO
	 * @return Integer
	 */
     Integer updateUserGroup(UserGroupBO userGroupBO);

	/**
	 *
	 * @Description 保存角色组并尝试关联角色
	 * @param roleGroupBO
	 * @return Long
	 */
     Long saveRoleGroup(RoleGroupBO roleGroupBO);

	/**
	 *
	 * @Description 更新角色组
	 * @param roleGroupBO
	 * @return Integer
	 */
     Integer updateRoleGroup(RoleGroupBO roleGroupBO);

	/**
	 *
	 * @Description 保存角色
	 * @param roleBO
	 * @return Long
	 */
     Long saveRole(RoleBO roleBO);

	/**
	 *
	 * @Description 更新角色
	 * @param roleBO
	 * @return Integer
	 */
     Integer updateRole(RoleBO roleBO);

	/**
	 *
	 * @Description 根据code查询用户组详情
	 * @param userGroupCode
	 * @return UserGroupBO
	 */
     UserGroupBO getByUserGroupCode(String userGroupCode);

	/**
	 *
	 * @Description 根据code查询角色详情
	 * @param roleCode
	 * @return RoleBO
	 */
     RoleBO getByRoleCode(String roleCode);

	/**
	 *
	 * @Description 根据code查询角色组详情
	 * @param roleGroupCode
	 * @return RoleGroupBO
	 */
     RoleGroupBO getByRoleGroupCode(String roleGroupCode);

	/**
	 * 禁用角色
	 * @param roleCode
	 * @return
	 * 这里并没有在role表中记录更新人信息
	 * 所以如果从操作日志角度来看会弄一个日志记录上下文来对接所有操作记录
	 * 这些操作记会在应用层完成
	 */
	 Boolean disableRole(String roleCode);

	/**
	 * 启用角色
	 * @param roleCode
	 * @return
	 */
	Boolean enableRole(String roleCode);

	/**
	 * 禁用用户组
	 * @param userGroupCode
	 * @return
	 */
	Boolean disableUserGroup(String userGroupCode);

	/**
	 * 启用角色组
	 * @param roleGroupCode
	 * @return
	 */
	Boolean enableRoleGroup(String roleGroupCode);

	/**
	 * 禁用角色组
	 * @param roleGroupCode
	 * @return
	 */
	Boolean disableRoleGroup(String roleGroupCode);

	/**
	 * 启用用户组
	 * @param userGroupCode
	 * @return
	 */
	Boolean enableUserGroup(String userGroupCode);


	/**
	 * 这里把用户从角色-用户关联关系中解除，同时将用户组内关联的该用户剔除
	 * @param userId
	 * @return
	 */
	Boolean removeUser(Long userId);


}